package it.saga.pes.frontoffice.servizi.struts2.rsm2.util;

import it.saga.pes.business.BusinessDelegate;
import it.saga.pes.business.bean.exception.BoServiceException;
import it.saga.pes.business.bean.infra.autorizzazioni.SoggettoFisicoBean;
import it.saga.pes.business.bean.infra.enti.EnteBean;
import it.saga.pes.business.bean.infra.enti.EnteComuneBean;
import it.saga.pes.business.bean.infra.enti.EnteProvinciaBean;
import it.saga.pes.business.bean.infra.servizi.DatoGenericoBean;
import it.saga.pes.business.bean.infra.servizi.DocumentoBean;
import it.saga.pes.business.bean.infra.servizi.ServizioBean;
import it.saga.pes.business.bean.misc.ChiaveValore;
import it.saga.pes.business.bean.servizi.PersonaFamigliaBean;
import it.saga.pes.business.bean.servizi.PersonaFisicaBean;
import it.saga.pes.business.bean.servizi.scuole.PraticaEtica;
import it.saga.pes.business.configuration.DozerMapperCache;
import it.saga.pes.frontoffice.servizi.struts2.rsm2.bean.PraticaMensa;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import net.sf.dozer.util.mapping.MapperIF;

import com.ibm.icu.util.Calendar;

public class ScolasticiMensaUtils {

	public static void initLocalInfra() {
		// usato in index.jsp per inizializzare infra in sviluppo locale
		String localInfraProperty = "/opt/portal/saga/conf/configuration_manager_local.properties";
		System.setProperty("INFRA.conf", localInfraProperty);
	}
	
	private static String mapperName = "Scolastici";
	private static MapperIF mapper;
	static{
		mapper = DozerMapperCache.getInstance(mapperName);
	}
	
	public static SoggettoFisicoBean getUtente(String username,BigDecimal idEnte){
		BusinessDelegate bd = new BusinessDelegate(idEnte);
		SoggettoFisicoBean sf = bd.loadUtente(username);
		return sf;
	}
	
	public static EnteBean cercaEnte(Long idEnte){
		BusinessDelegate bd = new BusinessDelegate(idEnte);
		EnteBean e = bd.loadEnte(idEnte);
		return e!=null?e:new EnteBean();
	}
	
	public static ServizioBean cercaServizio(Long codiceServizio,Long idEnte){
		BusinessDelegate bd = new BusinessDelegate(idEnte);
		ServizioBean s = bd.loadServizioFromCodice(codiceServizio);
		return s!=null?s:new ServizioBean();
	}
	
	
	public static List<ChiaveValore> listaProvince(Long pkidEnte) {
		BusinessDelegate bd = new BusinessDelegate(pkidEnte);
		List<EnteProvinciaBean> province = bd.listaProvince();
		List<ChiaveValore> lista = new ArrayList<ChiaveValore> ();
		for(EnteProvinciaBean e: province){
			ChiaveValore cv = new ChiaveValore(e.getSigla() ,e.getDescrizione());
			lista.add(cv);
		}
		return lista;
	};

	public static List<ChiaveValore> listaComuniCompleta(Long pkidEnte) {
		BusinessDelegate bd = new BusinessDelegate(pkidEnte);
		List<EnteComuneBean> comuni = bd.listaComuniCompleti("descrizione");
		List<ChiaveValore> lista = new ArrayList<ChiaveValore> ();
		for(EnteComuneBean c: comuni){
			ChiaveValore cv = new ChiaveValore(c.getCodiceIstat() ,c.getDescrizione());
			lista.add(cv);
		}
		return lista;
	}
	
	public static List<ChiaveValore> listaComuniProvincia(Long pkidEnteComune, Long pkidEnte) {
		BusinessDelegate bd = new BusinessDelegate(pkidEnte);
		List<EnteComuneBean> comuni = bd.listaComuniProvinciaFromCodice(pkidEnteComune);
		List<ChiaveValore> lista = new ArrayList<ChiaveValore> ();
		for(EnteComuneBean c: comuni){
			ChiaveValore cv = new ChiaveValore(c.getCodiceIstat() ,c.getDescrizione());
			lista.add(cv);
		}
		return lista;
	}

	public static List<ChiaveValore> listaCittadinanza(Long pkidEnte) {
		BusinessDelegate bd = new BusinessDelegate(pkidEnte);
		List<DatoGenericoBean> dati =  bd.listaCittadinanze();
		List<ChiaveValore> lista = new ArrayList<ChiaveValore> ();
		for(DatoGenericoBean dg : dati){
			if(dg.getDescrizioneDato()!=null&&dg.getDescrizioneDato().trim().length()>0){
				ChiaveValore cv = new ChiaveValore(dg.getDescrizioneDato(),dg.getDescrizioneDato());
				lista.add(cv);
			}
		}
		return lista;
	}
	
	public static PersonaFisicaBean cercaSoggetto(String codiceFiscale , Long idEnte){
		BusinessDelegate bd = new BusinessDelegate(idEnte);
		PersonaFisicaBean persona = bd.cercaSoggetto(codiceFiscale, new BigDecimal(idEnte));
		return persona;
	}
	
	public static List<PersonaFamigliaBean> cercaFamiglia(String codiceFiscale, Long pkidEnte) {
		BusinessDelegate bd = new BusinessDelegate(pkidEnte);
		return bd.cercaFamiglia(codiceFiscale);
	}
	
	public static List<ChiaveValore> listaFigli(String codiceFiscale, Long pkidEnte) {
		BusinessDelegate bd = new BusinessDelegate(pkidEnte);
		List<PersonaFamigliaBean> listaFamiglia =  bd.cercaFamiglia(codiceFiscale);
		List<ChiaveValore> lista = new ArrayList<ChiaveValore> ();
		for(PersonaFamigliaBean p : listaFamiglia){
			// minorenni della famiglia
			Calendar cal = Calendar.getInstance();
			cal.add(Calendar.YEAR, -18);
			Date magg = cal.getTime();
			Date dtNascita = p.getDataNascita();
			if(dtNascita.after(magg)){
				ChiaveValore cv = new ChiaveValore(p.getCodiceFiscale(),p.getNomeCompleto());
				lista.add(cv);
			}
		}
		return lista;
	}
	
	public static PraticaMensa getInfoUtente(String codiceFiscale, Long pkidEnte) {
		BusinessDelegate bd = new BusinessDelegate(pkidEnte);
		PraticaMensa dest = new PraticaMensa();
		try {
			// TEMPORANEO
			codiceFiscale="LMRLGU07M16B885X";
			PraticaEtica src =bd.getInfoUtente(codiceFiscale);
			mapper.map(src,dest);
		} catch (BoServiceException e) {
			e.printStackTrace();
		}
		return dest;
	}
	
	public static List<ChiaveValore> listaCircoli(Long pkidEnte) {
		BusinessDelegate bd = new BusinessDelegate(pkidEnte);
		try {
			return bd.listaCircoliEtica();
		} catch (BoServiceException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static List<ChiaveValore> listaScuole(String tipoScuola , Long pkidEnte) {
		BusinessDelegate bd = new BusinessDelegate(pkidEnte);
		try {
			return bd.listaScuoleEtica(tipoScuola);
		} catch (BoServiceException e) {
			e.printStackTrace();
		}
		return null;
	}

	public static List<ChiaveValore> listaClassi(String codScuola, Long pkidEnte) {
		BusinessDelegate bd = new BusinessDelegate(pkidEnte);
		try {
			return bd.listaClassiEtica(codScuola);
		} catch (BoServiceException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static String find(String key, List<ChiaveValore> lista ){
		for( ChiaveValore cv: lista){
			if (key.equals(cv.getChiave()))
				return cv.getValore();
		}
		return "";
	}
	
	public static List<DocumentoBean> listaAllegati(Long pkidEnte, Long codiceServizio, Long[] arrcodiceDato) {
		BusinessDelegate bd = new BusinessDelegate(pkidEnte);
		System.out.println(">pkidEnte"+pkidEnte);
		System.out.println(">codiceServizio"+codiceServizio);
		List<DocumentoBean> lista = bd.listaAllegati(pkidEnte, codiceServizio, arrcodiceDato);
		return lista;
	};
	
}
